package com.mp.util;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MpGenerator {
    /**
     * <p>
     * MySQL 生成演示
     * </p>
     */
    public static void main(String[] args) {
        //需要构建一个代码自动生成器对象
        AutoGenerator mpg = new AutoGenerator();
        //配置策略

        //1.全局配置
        GlobalConfig gc = new GlobalConfig();
        //获取系统当前目录
        String property = System.getProperty("user.dir");
        //代码生成到这个目录下
        gc.setOutputDir(property+"\\src\\main\\java");
        gc.setAuthor("ShouSi");//代码上注释的作者
        gc.setOpen(false);//是否打开资源管理器（代码生成后打开代码所在文件夹）
        gc.setFileOverride(true);//是否覆盖原来生成的
        gc.setServiceName("%sService");//去Service的I前缀
        gc.setIdType(IdType.ID_WORKER);//生成策略
        gc.setDateType(DateType.ONLY_DATE);//时间类型
        gc.setSwagger2(true);//自动配置swagger文档
        mpg.setGlobalConfig(gc);

        //2.设置数据源(配用户名链接密码连接数据库)
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/mp?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("root");
        dsc.setDbType(DbType.MYSQL);//数据库的类型
        mpg.setDataSource(dsc);

        //3.包的配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("mp");//模块名字
        pc.setParent("com");//生成模块在这个路径下
        pc.setEntity("entity");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setController("controller");
        mpg.setPackageInfo(pc);

        //策略配置
        StrategyConfig strategy = new StrategyConfig();
        //strategy.setInclude("user");//要生成的表名，想要生成哪个表的代码就填表名，可传多个参数，","隔开
        strategy.setNaming(NamingStrategy.underline_to_camel);//下划线转驼峰命名
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//列的名字下划线转驼峰
        strategy.setEntityLombokModel(true); //是否使用lombok开启注解链式变成是否支持
        strategy.setLogicDeleteFieldName("deleted");//逻辑删除（deleted表明）

        //自动填充配置
        TableFill tableFill = new TableFill("user", FieldFill.INSERT);//创建时自动填充策略user数据库表
        TableFill tableFill1 = new TableFill("user", FieldFill.INSERT_UPDATE);//修改时
        ArrayList<TableFill> list = new ArrayList<>();
        list.add(tableFill);
        list.add(tableFill1);
        strategy.setTableFillList(list);

        //乐观锁
        strategy.setVersionFieldName("version");//乐观锁
        strategy.setRestControllerStyle(true);//开启驼峰命名格式
        strategy.setControllerMappingHyphenStyle(true);//localhost:8080/hello_id_2

        // 自定义模板配置，可以 copy 源码 mybatis-plus/src/main/resources/templates 下面内容修改，
        // 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置，也可以自定义模板名称
        TemplateConfig tc = new TemplateConfig();
        tc.setController("/templatesMybatis/controller.java.vm");
        tc.setService("/templatesMybatis/service.java.vm");
        tc.setServiceImpl("/templatesMybatis/serviceImpl.java.vm");
        tc.setEntity("/templatesMybatis/entity.java.vm");
        tc.setMapper("/templatesMybatis/mapper.java.vm");
        tc.setXml("/templatesMybatis/mapper.xml.vm");
        // 如上任何一个模块如果设置 空 OR Null 将不生成该模块。
        mpg.setTemplate(tc);

        mpg.execute();//执行
    }
}
